home *** CD-ROM | disk | FTP | other *** search
/ Shareware Extravaganza - Disc 1 / ShareWare Extravaganza 1 of 4 (The Ultimate Shareware Company).iso / grprogs / picutil.exe / CUTIMG.ASM < prev    next >
Assembly Source File  |  1986-07-14  |  21KB  |  543 lines

  1. ;╔═════════════════════════════════════════════════════════════════════════════╗
  2. ;║ ░░░░░░░░░░░ PROGRAM = CUT.ASM  ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  3. ;╚═════════════════════════════════════════════════════════════════════════════╝
  4. CSEG           SEGMENT PUBLIC BYTE
  5.            ASSUME  CS:CSEG,DS:CSEG
  6.  
  7. CR           EQU     0DH
  8. LF           EQU     0AH
  9.  
  10. FILENAME       DB      128 DUP (0)
  11. HANDLE_IN      DW      0
  12. HANDLE_OUT     DW      0
  13. TYPE_FROM      DW      0               ;POINTS TO TYPE IN FILENAME
  14. OPTIONS        DB      128 DUP(0)           ;OPTIONS
  15.  
  16. TOP           DW      0
  17. BOTTOM           DW      0
  18. RIGHT           DW      0
  19. LEFT           DW      0
  20. DISK_BUFFER    DD      0               ;DISK BUFFER OFFSET
  21.                            ;DISK BUFFER SEGMENT
  22.  
  23. ;44 BYTES
  24. IMG_NAME       DB      '                              '
  25. IMG_HEIGHT     DW      0
  26. IMG_WIDTH      DW      0
  27. IMG_WIDTH_BYTE DW      0
  28. IMG_PIX_SIZE   DW      1
  29. IMG_PIX_FMT    DW      0
  30. IMG_COLOR      DW      0
  31. IMG_COMPRESS   DW      0
  32.  
  33. CUT_NAME       DB      '                              '
  34. CUT_HEIGHT     DW      0
  35. CUT_WIDTH      DW      0
  36. CUT_WIDTH_BYTE DW      0
  37. CUT_PIX_SIZE   DW      1
  38. CUT_PIX_FMT    DW      0
  39. CUT_COLOR      DW      0
  40. CUT_COMPRESS   DW      0
  41.  
  42. READ_POINTER   DW      44
  43.            DW      0
  44. WRITE_POINTER  DW      44
  45.            DW      0
  46. BYTE_ADJUST    DW      0
  47. EIGHT           DW      8
  48.  
  49. IMG           DB      'IMG',0
  50. CUT_STR        DB      'CUT',0
  51.  
  52. TELL_HOW       DB      '┌─────────────────────────────────────────────────────────────┐',cr,lf
  53.            DB      '│syntax = CUTIMG filename.IMG [t#],[b#],[r#],[l#]             │',cr,lf
  54.            DB      '├─────────────────────────────────────────────────────────────┤',cr,lf
  55.            DB      '│filename.typ = name of image file....must have correct type  │',cr,lf
  56.            DB      '├─────────────────────────────────────────────────────────────┤',cr,lf
  57.            DB      '│   t#  = Number of pixels to cut off top of file             │',CR,LF
  58.            DB      '│   b#  = Number of pixels to cut off bottom of file          │',CR,LF
  59.            DB      '│   r#  = Number of BYTES to cut off right side of file       │',CR,LF
  60.            DB      '│   l#  = Number of BYTES to cut off left side of file        │',CR,LF
  61.            DB      '│    #  = (0 to 65535)                                        │',CR,LF
  62.            DB      '└─────────────────────────────────────────────────────────────┘',cr,lf
  63.            DB      7,'$'
  64. OPEN_ERROR     DB      'open error on input file',cr,lf,'$'
  65. CREATE_ERROR   DB      'create error on output file',cr,lf,'$'
  66. TYPE_ERROR     DB      'error in type of input file',cr,lf
  67.            Db      'must be IMG',cr,lf,'$'
  68. NOT_IMP        DB      'NOT IMPLIMENTED YET',CR,LF,'$'
  69. SIZE_ERROR     DB      'pixels to cut exceed number of pixels in file',cr,lf,'$'
  70. DETAIL           DB      '          '
  71. WIDTH_B_STR    DB      '0000 BYTES          ',CR,LF
  72.            DB      '   <─────'
  73. WIDTH_STR      DB      '00000 PIXELS────>    ',CR,LF
  74.            DB      '   ┌─────────────────────┐    ',CR,LF
  75.            DB      '   │                     │/│\ ',CR,LF
  76.            DB      '   │                     │ │  ',CR,LF
  77.            DB      '   │      IMAGE          │ │  ',CR,LF
  78.            DB      '   │      SIZE           │ │  ',CR,LF
  79.            DB      '   │      BEFORE         │ │  ',CR,LF
  80.            DB      '   │      CUT            │ │  ',CR,LF
  81.            DB      '   │                     │ │ '
  82. HEIGHT_STR     DB      '00000 ',CR,LF
  83.            DB      '   │                     │ │ PIXELS ',CR,LF
  84.            DB      '   │                     │ │  ',CR,LF
  85.            DB      '   │                     │ │  ',CR,LF
  86.            DB      '   │                     │ │  ',CR,LF
  87.            DB      '   │                     │ │  ',CR,LF
  88.            DB      '   │                     │ │  ',CR,LF
  89.            DB      '   │                     │ │  ',CR,LF
  90.            DB      '   │                     │ │  ',CR,LF
  91.            DB      '   │                     │\│/ ',CR,LF
  92.            DB      '   └─────────────────────┘    '
  93.            DB      '$'
  94.  
  95. ;╔═════════════════════════════════════════════════════════════════════════════╗
  96. ;║ ░░░░░░░░░░░ CUT.ASM    ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  97. ;╚═════════════════════════════════════════════════════════════════════════════╝
  98. CUT           PROC    FAR
  99. ;┌─────────────────────────────────────────────────────────────────────────────┐
  100. ;│           RETURN SETUP                               │
  101. ;└─────────────────────────────────────────────────────────────────────────────┘
  102.            CLD
  103.            CLI
  104.            MOV     AX,CS               ;TEMP STACK
  105.            MOV     SS,AX               ;
  106.            MOV     ES,AX               ;
  107.            MOV     SP,OFFSET STACK           ;
  108.            STI
  109.            PUSH    DS               ;
  110.            XOR     AX,AX               ;
  111.            PUSH    AX               ;
  112. ;┌─────────────────────────────────────────────────────────────────────────────┐
  113. ;│           GET FILENAME FROM COMMAND LINE                       │
  114. ;└─────────────────────────────────────────────────────────────────────────────┘
  115.            MOV     SI,82H               ;START OF FILENAME
  116.            XOR     CH,CH               ;
  117.            MOV     CL,DS:[SI-2]           ;SIZE OF FILENAME
  118.            CMP     CX,0               ;NO COMMANDS
  119.            JE      GFN800               ;ERROR
  120.            MOV     DI,OFFSET FILENAME      ;STORE FILENAME HERE
  121. GFN100:
  122.            LODSB                   ;GET CHARACTER
  123.            CMP     AL,20H               ;END OF FILENAME?
  124.            JE      GFN700               ;YES....BRANCH
  125.            CMP     AL,CR               ;END OF COMMAND LINE?
  126.            JE      GFN900               ;YES....ERROR
  127.            STOSB                   ;SAVE CHARACTER
  128.            CMP     AL,'.'                  ;START OF TYPE
  129.            JNE     GFN200               ;
  130.            MOV     CS:TYPE_FROM,DI           ;START OF TYPE
  131. GFN200:
  132.            LOOP    GFN100               ;GET ANOTHER CHARACTER
  133.            JMP     SHORT GFN800           ;ERROR IF DONE ALREADY
  134. GFN300:
  135.            LODSB                   ;GET CHARACTER
  136.            CMP     AL,CR               ;END OF COMMAND LINE?
  137.            JE      GFN900               ;YES....ERROR
  138.            CMP     AL,'a'
  139.            JB      GFN400
  140.            CMP     AL,'z'
  141.            JA      GFN400
  142.            AND     AL,0DFH               ;CONVERT TO UPPER CASE
  143. GFN400:
  144.            STOSB                   ;SAVE CHARACTER
  145.            LOOP    GFN300               ;GET ANOTHER CHARACTER
  146.            JMP     SHORT GFN800           ;ERROR IF DONE
  147. GFN700:                        ;
  148.            MOV     AL,0               ;
  149.            STOSB                   ;
  150.            MOV     DI,OFFSET OPTIONS       ;
  151.            LOOP    GFN300
  152. GFN800:
  153.            MOV     DX,OFFSET TELL_HOW      ;
  154.            JMP     ERROR               ;
  155. GFN900:
  156.            MOV     AL,0               ;PUT NULL AT END OF STRING
  157.            STOSB                   ;
  158.            CMP     WORD PTR CS:TYPE_FROM,0 ;
  159.            JE      GFN800               ;ERROR
  160. ;┌─────────────────────────────────────────────────────────────────────────────┐
  161. ;│           FIND DISK MEMORY                            │
  162. ;└─────────────────────────────────────────────────────────────────────────────┘
  163.            MOV     AX,OFFSET PROG_END      ;
  164.            MOV     BX,CS               ;
  165.            MOV     DS,BX
  166.            SHR     AX,1               ;
  167.            SHR     AX,1               ;
  168.            SHR     AX,1               ;
  169.            SHR     AX,1               ;
  170.            ADD     BX,AX               ;
  171.            INC     BX               ;
  172.            MOV     WORD PTR DISK_BUFFER+2,BX      ;
  173. ;┌─────────────────────────────────────────────────────────────────────────────┐
  174. ;│           CHECK FOR CORRECT FILE TYPE                       │
  175. ;└─────────────────────────────────────────────────────────────────────────────┘
  176.            MOV     SI,OFFSET IMG           ;CHANGE TYPE ON FILENAME
  177.            MOV     DI,TYPE_FROM           ;
  178.            MOV     CX,3               ;
  179.            AND     BYTE PTR [DI],0DFH        ;MAKE CAPITOL LETTER
  180.            AND     BYTE PTR [DI+1],0DFH        ;MAKE CAPITOL LETTER
  181.            AND     BYTE PTR [DI+2],0DFH        ;MAKE CAPITOL LETTER
  182.            REP     CMPSB               ;
  183.            JNE     OIF050
  184. ;┌─────────────────────────────────────────────────────────────────────────────┐
  185. ;│           OPEN INPUT FILE                               │
  186. ;└─────────────────────────────────────────────────────────────────────────────┘
  187.            MOV     AH,3DH               ;OPEN FILE FOR READ
  188.            MOV     AL,0H               ;
  189.            MOV     DX,OFFSET FILENAME      ;
  190.            INT     21H               ;
  191.            JNC     OIF100
  192. OIF050:
  193.            MOV     DX,OFFSET OPEN_ERROR    ;
  194.            JMP     ERROR
  195. OIF100:
  196.            MOV     HANDLE_IN,AX
  197. ;┌─────────────────────────────────────────────────────────────────────────────┐
  198. ;│           CHECK FOR OPTIONS                           │
  199. ;└─────────────────────────────────────────────────────────────────────────────┘
  200.            MOV     SI,OFFSET OPTIONS
  201. OPT100:
  202.            LODSB
  203.            CMP     AL,0               ;END OF OPTIONS?
  204.            JE      OPT900               ;YES GO ON
  205.            AND     AL,0DFH
  206.  
  207.            CMP     AL,'T'                  ;UP
  208.            JNE     OPT200
  209.            CALL    GET_NUMBER
  210.            MOV     TOP,AX
  211.            JMP     SHORT OPT100
  212. OPT200:
  213.            CMP     AL,'B'                  ;DOWN
  214.            JNE     OPT300
  215.            CALL    GET_NUMBER
  216.            MOV     BOTTOM,AX
  217.            JMP     SHORT OPT100
  218. OPT300:
  219.            CMP     AL,'R'                  ;DOWN
  220.            JNE     OPT400
  221.            CALL    GET_NUMBER
  222.            MOV     RIGHT,AX
  223.            JMP     SHORT OPT100
  224. OPT400:
  225.            CMP     AL,'L'                  ;LEFT
  226.            JNE     OPT100
  227.            CALL    GET_NUMBER
  228.            MOV     LEFT,AX
  229.            JMP     SHORT OPT100
  230. OPT900:
  231. ;┌─────────────────────────────────────────────────────────────────────────────┐
  232. ;│           READ IMG HEADER                               │
  233. ;└─────────────────────────────────────────────────────────────────────────────┘
  234.            MOV     AH,3FH
  235.            MOV     BX,HANDLE_IN
  236.            MOV     CX,44
  237.            MOV     DX,OFFSET IMG_NAME
  238.            INT     21H
  239. ;┌─────────────────────────────────────────────────────────────────────────────┐
  240. ;│           COPY TO CUT HEADER                           │
  241. ;└─────────────────────────────────────────────────────────────────────────────┘
  242.            MOV     SI,OFFSET IMG_NAME
  243.            MOV     DI,OFFSET CUT_NAME
  244.            MOV     CX,44
  245.            REP     MOVSB
  246. ;┌─────────────────────────────────────────────────────────────────────────────┐
  247. ;│           PRINT SIZE OF IMG                           │
  248. ;└─────────────────────────────────────────────────────────────────────────────┘
  249.            MOV     AX,IMG_WIDTH_BYTE
  250.            MOV     BX,4
  251.            MOV     DI,OFFSET WIDTH_B_STR
  252.            CALL    BIN2ASC
  253.  
  254.            MUL     EIGHT
  255.            MOV     BX,5
  256.            MOV     DI,OFFSET WIDTH_STR
  257.            CALL    BIN2ASC
  258.  
  259.            MOV     AX,IMG_HEIGHT
  260.            MOV     BX,5
  261.            MOV     DI,OFFSET HEIGHT_STR
  262.            CALL    BIN2ASC
  263.  
  264.            MOV     DX,OFFSET DETAIL
  265.            MOV     AH,9
  266.            INT     21H
  267. ;┌─────────────────────────────────────────────────────────────────────────────┐
  268. ;│           CHECK FOR SIZE                               │
  269. ;└─────────────────────────────────────────────────────────────────────────────┘
  270.            MOV     AX,LEFT
  271.            ADD     AX,RIGHT
  272.            CMP     AX,IMG_WIDTH_BYTE
  273.            JAE     CHK100
  274.            MOV     AX,TOP
  275.            ADD     AX,BOTTOM
  276.            CMP     AX,IMG_HEIGHT
  277.            JB      CHK200
  278. CHK100:
  279.            MOV     BX,HANDLE_IN           ;CLOSE FILE
  280.            MOV     AH,3EH               ;
  281.            INT     21H               ;
  282.            MOV     DX,OFFSET SIZE_ERROR    ;
  283.            JMP     ERROR
  284. CHK200:
  285.            CMP     LEFT,0
  286.            JNE     CHK900
  287.            CMP     RIGHT,0
  288.            JNE     CHK900
  289.            CMP     TOP,0
  290.            JNE     CHK900
  291.            CMP     BOTTOM,0
  292.            JNE     CHK900
  293.            JMP     CLOSE
  294. CHK900:
  295. ;┌─────────────────────────────────────────────────────────────────────────────┐
  296. ;│           CALCULATE HEADER PARMS                           │
  297. ;└─────────────────────────────────────────────────────────────────────────────┘
  298.            MOV     AX,IMG_HEIGHT
  299.            SUB     AX,TOP
  300.            SUB     AX,BOTTOM
  301.            MOV     CUT_HEIGHT,AX
  302.  
  303.            MOV     AX,IMG_WIDTH_BYTE
  304.            SUB     AX,RIGHT
  305.            SUB     AX,LEFT
  306.            MOV     CUT_WIDTH_BYTE,AX
  307.            MUL     EIGHT
  308.            MOV     CUT_WIDTH,AX
  309. ;┌─────────────────────────────────────────────────────────────────────────────┐
  310. ;│           CHANGE FILENAME                               │
  311. ;└─────────────────────────────────────────────────────────────────────────────┘
  312.            MOV     SI,OFFSET CUT_STR       ;CHANGE TYPE ON FILENAME
  313.            MOV     DI,TYPE_FROM           ;
  314.            MOV     CX,3               ;
  315.            REP     MOVSB               ;
  316. ;┌─────────────────────────────────────────────────────────────────────────────┐
  317. ;│           CREATE OUTPUT FILE                           │
  318. ;└─────────────────────────────────────────────────────────────────────────────┘
  319.            MOV     AH,3CH               ;
  320.            MOV     CX,20H               ;
  321.            MOV     DX,OFFSET FILENAME      ;
  322.            INT     21H               ;
  323.            JNC     COF100
  324.            MOV     DX,OFFSET CREATE_ERROR  ;
  325.            JMP     ERROR
  326. COF100:
  327.            MOV     HANDLE_OUT,AX
  328. ;┌─────────────────────────────────────────────────────────────────────────────┐
  329. ;│           WRITE NEW HEADER                            │
  330. ;└─────────────────────────────────────────────────────────────────────────────┘
  331.            MOV     AH,40H
  332.            MOV     BX,HANDLE_OUT
  333.            MOV     CX,44
  334.            MOV     DX,OFFSET CUT_NAME
  335.            INT     21H
  336. ;┌─────────────────────────────────────────────────────────────────────────────┐
  337. ;│           TRANSFER FILE                               │
  338. ;└─────────────────────────────────────────────────────────────────────────────┘
  339.            CMP     TOP,0
  340.            JE      CFA200
  341.            MOV     CX,TOP
  342. CFA100:
  343.            CALL    READ_LINE
  344.            LOOP    CFA100
  345. CFA200:
  346.            MOV     CX,CUT_HEIGHT
  347. CFA300:
  348.            CALL    READ_LINE
  349.            CALL    WRITE_LINE
  350.            LOOP    CFA300
  351. ;┌─────────────────────────────────────────────────────────────────────────────┐
  352. ;│           CLOSE FILES                               │
  353. ;└─────────────────────────────────────────────────────────────────────────────┘
  354. CLOSE:
  355.            MOV     BX,HANDLE_IN           ;CLOSE FILE
  356.            MOV     AH,3EH               ;
  357.            INT     21H               ;
  358.            MOV     BX,HANDLE_OUT           ;CLOSE FILE
  359.            MOV     AH,3EH               ;
  360.            INT     21H               ;
  361.            JMP     EXIT
  362. ERROR:
  363.            MOV     AX,CS
  364.            MOV     DS,AX
  365.            MOV     AH,9
  366.            INT     21H
  367. EXIT:
  368.            RET                   ;
  369. CUT           ENDP
  370.  
  371. ;╔═════════════════════════════════════════════════════════════════════════════╗
  372. ;║ ░░░░░░░░░░░ GET NUMBER ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  373. ;╚═════════════════════════════════════════════════════════════════════════════╝
  374. ;┌─────────────────────────────────────────────────────────────────────────────┐
  375. ;│           GET NUMBER FOLLOWING COMMAND                       │
  376. ;└─────────────────────────────────────────────────────────────────────────────┘
  377. GET_NUMBER     PROC    NEAR
  378.  
  379.            PUSH    BX
  380.            MOV     BX,0
  381. GN100:
  382.            CMP     BYTE PTR [SI+BX],'0'
  383.            JB      GN200
  384.            CMP     BYTE PTR [SI+BX],'9'
  385.            JA      GN200
  386.            INC     BX
  387.            JMP     SHORT GN100
  388. GN200:
  389.            MOV     AX,BX
  390.            CALL    ASC2BIN
  391.            ADD     SI,BX
  392.            POP     BX
  393.            RET
  394.  
  395. GET_NUMBER     ENDP
  396. ;╔═════════════════════════════════════════════════════════════════════════════╗
  397. ;║ ░░░░░░░░░░░ ASCII TO BINARY ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  398. ;╚═════════════════════════════════════════════════════════════════════════════╝
  399. DIVISOR        DW      0,1
  400. TEN           DW      10,100,1000,10000
  401. ;┌─────────────────────────────────────────────────────────────────────────────┐
  402. ;│        DS:SI = START OF ASCII STRING                       │
  403. ;│           AX = NUMBER OF CHARACTER IN STRING (1-5)                │
  404. ;├─────────────────────────────────────────────────────────────────────────────┤
  405. ;│           AX = RETURNS BINARY NUMBER                       │
  406. ;└─────────────────────────────────────────────────────────────────────────────┘
  407.            PUBLIC  ASC2BIN
  408. ASC2BIN        PROC    NEAR
  409.  
  410.            PUSH    BX               ;SAVE REGISTERS
  411.            PUSH    CX               ;
  412.            PUSH    DX               ;
  413.            PUSH    SI               ;
  414.  
  415.            SHL     AX,1               ;MAKE INTO WORD OFFSET
  416.            MOV     BX,AX               ;
  417.            PUSH    SI               ;
  418.            MOV     SI,OFFSET DIVISOR       ;
  419.            MOV     CX,[SI+BX]           ;DIVISOR
  420.            POP     SI               ;
  421.            XOR     BX,BX               ;CLEAR BINARY HOLD REGISTER
  422.                            ;
  423. ASC100:                        ;
  424.            LODSB                   ;GET ASCII NUMBER
  425.            AND     AL,0FH               ;STRIP ASCII PART
  426.            XOR     AH,AH               ;
  427.            MUL     CX               ;
  428.            ADD     BX,AX               ;
  429.            CMP     CX,1               ;DONE?
  430.            JE      ASC300
  431.            MOV     AX,CX               ;GET DIVISOR
  432.            XOR     DX,DX               ;
  433.            DIV     TEN               ;DIVIDE IT BY TEN
  434.            MOV     CX,AX               ;PUT BACK IN DX
  435.            JMP     SHORT ASC100           ;
  436. ASC300:
  437.            MOV     AX,BX               ;PUT BINARY NUMBER IN AX
  438.            POP     SI               ;RESTORE REGISTERS
  439.            POP     DX               ;
  440.            POP     CX               ;
  441.            POP     BX               ;
  442.            RET
  443. ASC2BIN        ENDP
  444. ;╔═════════════════════════════════════════════════════════════════════════════╗
  445. ;║ ░░░░░░░░░░░ BINARY TO ASCII ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  446. ;╚═════════════════════════════════════════════════════════════════════════════╝
  447. ;┌─────────────────────────────────────────────────────────────────────────────┐
  448. ;│           AX = BINARY NUMBER                           │
  449. ;│           BX = NUMBER OF ASCII CHARACTERS TO FILL    (1-5)               │
  450. ;│        ES:DI = WHERE TO PUT ASCII STRING                       │
  451. ;└─────────────────────────────────────────────────────────────────────────────┘
  452.            PUBLIC  BIN2ASC
  453. BIN2ASC        PROC    NEAR
  454.  
  455.            PUSH    AX               ;SAVE REGISTERS
  456.            PUSH    BX               ;
  457.            PUSH    CX               ;
  458.            PUSH    DX               ;
  459.            PUSH    DI               ;
  460.            PUSH    SI               ;
  461.            PUSH    ES
  462.  
  463.            SHL     BX,1               ;MAKE INTO WORD OFFSET
  464.            MOV     SI,OFFSET DIVISOR       ;
  465.            MOV     CX,[SI+BX]           ;DIVISOR
  466.  
  467. BIN100:                        ;
  468.            XOR     DX,DX               ;CLEAR DX FOR DIVIDE
  469.            DIV     CX               ;
  470.            ADD     AL,'0'                  ;
  471.            STOSB                   ;
  472.            CMP     CX,1               ;
  473.            JE      BIN300               ;
  474.            PUSH    DX               ;SAVE REMAINDER
  475.            MOV     AX,CX               ;GET DIVISOR
  476.            XOR     DX,DX               ;
  477.            DIV     TEN               ;DIVIDE IT BY TEN
  478.            MOV     CX,AX               ;PUT BACK IN DX
  479.            POP     AX               ;GET REMAINDER IN AX
  480.            JMP     SHORT BIN100           ;
  481. BIN300:
  482.            POP     ES
  483.            POP     SI               ;RESTORE REGISTERS
  484.            POP     DI               ;
  485.            POP     DX               ;
  486.            POP     CX               ;
  487.            POP     BX               ;
  488.            POP     AX               ;
  489.            RET
  490. BIN2ASC        ENDP
  491. ;╔═════════════════════════════════════════════════════════════════════════════╗
  492. ;║ ░░░░░░░░░░░ READ_LINE ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  493. ;╚═════════════════════════════════════════════════════════════════════════════╝
  494. READ_LINE      PROC    NEAR
  495.  
  496.            PUSH    BX
  497.            PUSH    CX
  498.            PUSH    DX
  499.            PUSH    DS
  500.            MOV     AH,3FH
  501.            MOV     BX,HANDLE_IN
  502.            MOV     CX,IMG_WIDTH_BYTE
  503.            LDS     DX,DISK_BUFFER
  504.            INT     21H
  505.            POP     DS
  506.            POP     DX
  507.            POP     CX
  508.            POP     BX
  509.            RET
  510.  
  511. READ_LINE      ENDP
  512. ;╔═════════════════════════════════════════════════════════════════════════════╗
  513. ;║ ░░░░░░░░░░░ WRITE_LINE ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░ ║
  514. ;╚═════════════════════════════════════════════════════════════════════════════╝
  515. WRITE_LINE     PROC    NEAR
  516.  
  517.            PUSH    BX
  518.            PUSH    CX
  519.            PUSH    DX
  520.            PUSH    DS
  521.            MOV     AH,40H
  522.            MOV     BX,HANDLE_OUT
  523.            MOV     CX,CUT_WIDTH_BYTE
  524.            LDS     DX,DISK_BUFFER
  525.            ADD     DX,CS:LEFT
  526.            INT     21H
  527.            POP     DS
  528.            POP     DX
  529.            POP     CX
  530.            POP     BX
  531.            RET
  532.  
  533. WRITE_LINE     ENDP
  534. ;╔═════════════════════════════════════════════════════════════════════════════╗
  535. ;╚═════════════════════════════════════════════════════════════════════════════╝
  536.            DB      64 DUP('STACK')
  537. STACK           EQU     $
  538. PROG_END       EQU     $
  539. ;╔═════════════════════════════════════════════════════════════════════════════╗
  540. ;╚═════════════════════════════════════════════════════════════════════════════╝
  541. CSEG           ENDS
  542.            END     CUT
  543.